home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
MACD 5
/
MACD 5.bin
/
workbench
/
tools
/
czesc_1
/
bangermenu
/
bangermenudisk.asm
< prev
next >
Wrap
Assembly Source File
|
1984-08-28
|
16KB
|
737 lines
;Programm: BangerMenuDisk bietet eine grafische Oberfläche zum Anwählen von Programmen
; die beim Starten in der Startup-Sequence aufgerufen werden sollen.
;Autor : Andre´ Trettin
;Codename: Banger
;Begin : 31-Mai-95 17:08:28
;$VER : BangerMenuDisk.Asm 1.4 (13-Feb-96)
** INCLUDE Struktur Variablen
* Fehler Codes: 21=kein Speicher
* 22=konnte Library (oder Libraries) nicht öffnen
* 23=GetVisualInfo Fehler
* 24=konnte File S:Banger.Prefs nicht öffnen
* 25=bei der Gadgeterschaffung trat ein Fehler auf
* 26=konnte Fenster nicht öffnen oder Task nicht Finden
* 27=Einstellungen sind Leer
* 28=kein Speicher für die Einstellungen
* 29=kein MsgPort
* 30=konnte kein IORequest create
* 31=konnte Device nicht öffnen
* 32=falsche Parameter angabe
* 10=Return Code für die Startup-Sequence
incdir INCLUDE:
include exec/exec.i
include exec/io.i
include devices/input.i
include devices/inputevent.i
include dos/dos.i
include dos/dosextens.i
include intuition/intuition.i
include libraries/gadtools.i
include lvo/exec_lib.i
include lvo/dos_lib.i
include lvo/intuition_lib.i
include lvo/gadtools_lib.i
include lvo/input_lib.i
STRUCTURE Internal,0
APTR INTUIBase
APTR DOSBase
APTR GADBase
APTR WindowHandle
APTR OutputHandle
APTR ScreenHandle
APTR VisualInfo
APTR PrefsFileHandle
APTR FileSpeicher
APTR FontAddr
APTR GadgetListe
APTR meinTask
APTR alterTask
APTR AnGad
APTR MsgPortAddr
APTR RDArgs
STRUCT FIB,[fib_SIZEOF]
STRUCT GadgetAddr,[68*4]
STRUCT TastenIBlock,[IO_SIZE]
LONG Filegroesse
LONG NOKEYArray
WORD BreiteGPos
WORD BreiteGADs
WORD BreiteWin
WORD CAPS
BYTE AnzahlGADs
BYTE RelativeTopC
BYTE RelativeLeftC
LABEL Int_SIZEOF
;;
** Hauptprog
moveq #0,d7
move.l 4.w,a6
move.l #Int_SIZEOF,d0
move.l #MEMF_PUBLIC!MEMF_CLEAR,d1
jsr _LVOAllocMem(a6)
move.l d0,a5
bne.s LibraryO
moveq #21,d7 ;21 = kein Speicher
bra.s Ende
LibraryO
bsr.w InitRelative
bsr.w LibOeffne
tst.w d7
bne.s SchliesseLibrary
bsr.s Parameter
tst.w d7
bne.s SchliesseLibrary
bsr.w WaitOnCaps
cmp.w #10,d7
bhi.s SchliesseLibrary
tst.w d7
beq.s Menuerscheine
moveq #0,d7
bra.s SchliesseLibrary
Menuerscheine
bsr.w PubScreenOeffne
tst.w d7
bne.s SchliesseLibrary
bsr.w LadePrefs
tst.w d7
bne.s SchliesseScreen
bsr.w InitGadget
tst.w d7
bne.s FreiSPrefs
bsr.w FensterOeffne
tst.w d7
bne.s RemGad
bsr.w GadAktivieren
bsr.w RefreshWin
bsr.w MessageAbFragen
bsr.w FensterSchliesse
RemGad
bsr.w RemoveGadget
FreiSPrefs
bsr.w SpeicherPrefs
SchliesseScreen
bsr.w ScreenSchliesse
SchliesseLibrary
bsr.w LibSchliesse
move.l a5,a1
move.l #Int_SIZEOF,d0
jsr _LVOFreeMem(a6)
Ende
move.l d7,d0
ende
rts
;;
** Parameter
Parameter
move.l DOSBase(a5),a6
lea ParaTemplate(pc),a1
move.l a1,d1
lea NOKEYArray(a5),a1
move.l a1,d2
moveq #0,d3
jsr _LVOReadArgs(a6)
move.l d0,RDArgs(a5)
bne.s ParaOK
jsr _LVOIoErr(a6)
move.l d0,d1
moveq #0,d2
jsr _LVOPrintFault(a6)
moveq #32,d7
rts
ParaOK
move.l RDArgs(a5),d1
jsr _LVOFreeArgs(a6)
rts
;;
** Warte auf Caps Lock
WaitOnCaps
tst.l NOKEYArray(a5)
bne.s NOKeyJA
move.l 4.w,a6
jsr _LVOCreateMsgPort(a6)
move.l d0,MsgPortAddr(a5)
bne.s MsgPortOK
moveq #29,d7 ;29 = kein MsgPort
addq #4,a7
pea SchliesseLibrary(pc)
rts
MsgPortOK
move.l d0,a0
move.l #IOSTD_SIZE,d0
jsr _LVOCreateIORequest(a6)
move.l d0,TastenIBlock(a5)
bne.s OeffneDev
moveq #30,d7 ;30=konnte kein IORequest create
bra.s FreiMsgP
OeffneDev
lea inputname(pc),a0
move.l d0,a1
moveq #0,d0
move.l #IOF_QUICK,d1
jsr _LVOOpenDevice(a6)
tst.l d0
beq.s DevOK
moveq #31,d7 ;31=konnte Device nicht öffnen
bra.s IOReqDel
DevOK
move.l TastenIBlock(a5),a0
move.l IO_DEVICE(a0),a6
jsr _LVOPeekQualifier(a6)
and.w #IEQUALIFIER_CAPSLOCK,d0
cmp.w #IEQUALIFIER_CAPSLOCK,d0
beq.s CAPSgedrueckt
moveq #10,d7
CAPSgedrueckt
move.l 4.w,a6
lea TastenIBlock(a5),a1
jsr _LVOCloseDevice(a6)
IOReqDel
move.l TastenIBlock(a5),a0
jsr _LVODeleteIORequest(a6)
FreiMsgP
move.l MsgPortAddr(a5),a0
jsr _LVODeleteMsgPort(a6)
NOKeyJA
rts
;;
** GadAktivieren
GadAktivieren
move.l GadgetAddr(a5),a4
moveq #1,d6
bsr.w SelGK
lea GadgetAddr(a5),a4
move.l a4,AnGad(a5)
rts
;;
** Relative Init
InitRelative
lea topazFName8(pc),a0
lea topaz8(pc),a1
move.l a0,(a1)
move.l a1,FontAddr(a5)
rts
;;
** Message Auswertung
MessageAbFragen
move.l WindowHandle(a5),a0
move.l wd_UserPort(a0),a0
move.l 4.w,a6
jsr _LVOWaitPort(a6)
nocheine
move.l GADBase(a5),a6
move.l WindowHandle(a5),a0
move.l wd_UserPort(a0),a0
jsr _LVOGT_GetIMsg(a6)
move.l d0,a1
tst.l d0
beq.s MessageAbFragen
move.l im_Class(a1),d4
move.w im_Code(a1),d5
move.l im_IAddress(a1),a4
jsr _LVOGT_ReplyIMsg(a6)
cmpi.l #IDCMP_CLOSEWINDOW,d4
beq.w ende
cmpi.l #IDCMP_REFRESHWINDOW,d4
beq.s RefreWin
cmpi.l #IDCMP_GADGETUP,d4
beq.w GadAuswertung
cmpi.l #IDCMP_VANILLAKEY,d4
beq.w VTastendruck
cmpi.l #IDCMP_RAWKEY,d4
beq.w RTastendruck
bra.s nocheine
RefreWin
bsr.w RefreshWin
bra.s nocheine
UpTaste
move.l AnGad(a5),a4
lea GadgetAddr(a5),a3
cmp.l a3,a4
beq.s DownTEnde
lea -4(a4),a3
bra.s GadAnwaehlen
DownTaste
move.l AnGad(a5),a4
lea 4(a4),a3
cmp.l #0,(a3)
beq.s DownTEnde
GadAnwaehlen
move.l (a4),a4
moveq #0,d6
bsr.w SelGK
moveq #1,d6
move.l (a3),a4
bsr.w SelGK
move.l (a3),a3
bsr.w GetGAddr
DownTEnde
bra.w nocheine
rechteBank
bsr.s NummerGad
add.w #17,d0
cmp.b AnzahlGADs(a5),d0
bls.s rechtsOK
sub.b AnzahlGADs(a5),d0
neg.w d0
add.w #17,d0
bra.s rechtsweiter
rechtsOK
moveq #17,d0
rechtsweiter
asl.w #2,d0
lea (a4,d0.w),a3
bra.s GadAnwaehlen
NummerGad
move.l AnGad(a5),a4
move.l (a4),a3
move.w gg_GadgetID(a3),d0
rts
linkeBank
bsr.s NummerGad
sub.w #18,d0
tst.w d0
bgt.s linksOk
moveq #0,d0
linksOk
asl.w #2,d0
lea GadgetAddr(a5),a3
lea (a3,d0.w),a3
bra.s GadAnwaehlen
RTastendruck
cmp.b #$4e,d5 ;rechts
beq.b rechteBank
cmp.b #$4f,d5 ;links
beq.s linkeBank
cmp.b #$4d,d5 ;Down
beq.w DownTaste
cmp.b #$4c,d5 ;Up
beq.w UpTaste
bra.w nocheine
VTastendruck
cmp.b #$0d,d5
beq.s Auswahl
cmp.b #$1b,d5
beq.w ende
bclr #5,d5
cmp.b #'Q',d5
beq.w ende
bra.w nocheine
GetGAddr
lea GadgetAddr(a5),a4
FindeGAdd
cmp.l (a4)+,a3
beq.s RichtGAdd
bra.s FindeGAdd
RichtGAdd
lea -4(a4),a4
move.l a4,AnGad(a5)
rts
SelGK
move.l WindowHandle(a5),a0
bsr.b RemoveGSuche
tst.l d6
beq.s DisSel
or.w #GFLG_SELECTED,gg_Flags(a4)
bra.s NunSel
DisSel
eor.w #GFLG_SELECTED,gg_Flags(a4)
NunSel
move.l WindowHandle(a5),a0
bsr.b AddGSuche
rts
RemoveGSuche
move.l a4,a1
move.l INTUIBase(a5),a6
jsr _LVORemoveGadget(a6)
rts
AddGSuche
move.l WindowHandle(a5),a0
move.l a4,a1
moveq #-1,d0
jsr _LVOAddGadget(a6)
move.l a4,a0
move.l WindowHandle(a5),a1
suba.l a2,a2
jsr _LVORefreshGadgets(a6)
rts
Auswahl
move.l AnGad(a5),a4
move.l (a4),a4
GadAuswertung
move.w gg_GadgetID(a4),d6
asl.b #1,d6
subq #2,d6
move.l FileSpeicher(a5),a1
SucheExloop
cmp.b #0,(a1)+
bne.s SucheExloop
dbra d6,SucheExloop
move.l a1,d1
moveq #0,d2
moveq #0,d3
move.l DOSBase(a5),a6
jsr _LVOExecute(a6)
moveq #10,d7
rts
;;
** Refresh Fenster
RefreshWin
move.l GADBase(a5),a6
move.l WindowHandle(a5),a0
suba.l a1,a1
jsr _LVOGT_RefreshWindow(a6)
move.l WindowHandle(a5),a0
jsr _LVOGT_BeginRefresh(a6)
move.l WindowHandle(a5),a0
moveq #DOSTRUE,d0
jsr _LVOGT_EndRefresh(a6)
rts
;;
** Fenster Öffnen
FensterOeffne
move.l INTUIBase(a5),a6
lea Fenster_Tags(pc),a1
move.l GadgetListe(a5),12(a1)
lea WindowTitle(pc),a0
move.l a0,4(a1)
lea ScreenTitle(pc),a0
move.l a0,20(a1)
move.w BreiteGPos(a5),d0
add.w #40,d0
move.w d0,30(a1)
sub.w #640,d0
neg.w d0
asr.w #1,d0
move.w d0,54(a1)
move.w BreiteWin(a5),d4
bne.s BreiteresWin
move.b AnzahlGADs(a5),d4
BreiteresWin
move.w d4,d6
move.w d6,d5
add.w d6,d5
asl.w #3,d4
add.w d5,d4
add.w #36,d4
move.w d4,38(a1)
move.w #252,d0
sub.w d4,d0
asr.w #1,d0
move.w d0,46(a1)
suba.l a0,a0
jsr _LVOOpenWindowTagList(a6)
move.l d0,WindowHandle(a5)
beq.b ErrorWindow
move.l 4.w,a6
suba.l a1,a1
jsr _LVOFindTask(a6)
move.l d0,meinTask(a5)
beq.s ErrorTask
move.l d0,a0
move.l pr_WindowPtr(a0),alterTask(a5)
move.l WindowHandle(a5),pr_WindowPtr(a0)
rts
ErrorTask
bsr.s keinTask
ErrorWindow
moveq #26,d7 ;26 = konnte Fenster nicht öffnen oder Task nicht finden
rts
FensterSchliesse
move.l meinTask(a5),a0
move.l alterTask(a5),pr_WindowPtr(a0)
keinTask
move.l INTUIBase(a5),a6
move.l WindowHandle(a5),a0
jsr _LVOCloseWindow(a6)
rts
;;
** Init Gadgets
InitGadget
move.l ScreenHandle(a5),a0
move.l sc_Font(a0),a1
move.w ta_YSize(a1),d2
add.b sc_WBorTop(a0),d2
addq #1,d2
move.b d2,RelativeTopC(a5)
move.b sc_WBorTop(a0),RelativeLeftC(a5)
move.l FileSpeicher(a5),a1
move.l Filegroesse(a5),d0
move.l a1,a2
add.l d0,a2
moveq #0,d0
moveq #0,d1
moveq #0,d2
moveq #0,d3
Suchenloop
addq #1,d1 ;länge GadgetName aus der Prefs
move.b (a1)+,d4 ;Prefs daten nach d4
einReturn
cmp.b #10,d4 ;schon ein Return ?
bne.s keinReturn
move.b #0,-1(a1) ;das Return mit NullByte abschliessen
tst.b d3 ;d3 0/1 entweder Gadgetname oder Programm bzw. Batchdatei
beq.s BreiteZaehlen
moveq #0,d3
bra.s wortkleiner
BreiteZaehlen
moveq #1,d3
addq #1,d0 ;d0=Anzahl der Gadgets
cmp.b d2,d1 ;d2 enthält den längsten Gadgetnamen
bls.s wortkleiner
move.b d1,d2 ;neue länge war größer als alte
wortkleiner
moveq #0,d1
keinReturn
cmp.l a1,a2 ;a2=a1 dann PrefsEnde
bne.s Suchenloop
PrefsEnde
tst.b d0
beq.w PrefsNull
move.b d0,AnzahlGADs(a5)
asl.w #3,d2
add.w #10,d2
move.w d2,BreiteGADs(a5)
lea GadgetListe(a5),a0
move.l GADBase(a5),a6
jsr _LVOCreateContext(a6)
move.l d0,a0
beq.w ErrorGadget
lea UniGad(pc),a1
move.b RelativeTopC(a5),d2
move.b RelativeLeftC(a5),d3
add.b d2,gng_TopEdge+1(a1)
add.b d3,gng_LeftEdge+1(a1)
move.w BreiteGADs(a5),gng_Width(a1)
move.l VisualInfo(a5),gng_VisualInfo(a1)
move.l FontAddr(a5),gng_TextAttr(a1)
move.l FileSpeicher(a5),a4
moveq #0,d6
move.b AnzahlGADs(a5),d6
subq #1,d6
lea GadgetAddr(a5),a3
move.w #20,BreiteGPos(a5)
InitGadloop
moveq #BUTTON_KIND,d0
lea UniGad(pc),a1
move.l a4,gng_GadgetText(a1)
bsr.w Return2Find
cmp.w #180,gng_TopEdge(a1)
bge.s GadgetCorritur
GadgetCoOK
add.w #10,gng_TopEdge(a1)
add.w #1,gng_GadgetID(a1)
suba.l a2,a2
jsr _LVOCreateGadgetA(a6)
move.l d0,(a3)+
beq.s ErrorGadget
move.l d0,a0
dbra d6,InitGadloop
cmp.w #20,BreiteGPos(a5)
bne.s BreiteDa
move.w BreiteGADs(a5),BreiteGPos(a5)
rts
BreiteDa
move.w BreiteGADs(a5),d2
sub.w #20,d2
add.w d2,BreiteGPos(a5)
rts
GadgetVorEnde
sub.w #40,d2
move.w d2,BreiteGPos(a5)
rts
GadgetCorritur
clr.w gng_TopEdge(a1)
move.b RelativeTopC(a5),d2
add.b d2,gng_TopEdge+1(a1)
move.w BreiteGADs(a5),d2
add.w #20,d2
add.w BreiteGPos(a5),d2
move.w d2,d5
add.w BreiteGADs(a5),d5
cmp.w #630,d5
bgt.s GadgetVorEnde
move.w d2,BreiteGPos(a5)
move.w BreiteGPos(a5),gng_LeftEdge(a1)
move.w #17,BreiteWin(a5)
bra.s GadgetCoOK
ErrorGadget
bsr.s RemoveGadget
moveq #25,d7 ;25 = Gadget init Fehler
rts
RemoveGadget
move.l GADBase(a5),a6
move.l GadgetListe(a5),a0
jsr _LVOFreeGadgets(a6)
rts
Return2Find
cmp.b #0,(a4)+
bne.s Return2Find
Return1Mal
cmp.b #0,(a4)+
bne.s Return1Mal
rts
PrefsNull
moveq #27,d7 ;27 = Prefs sind Null
rts
;;
** Speicher freigeben von den Einstellungen
SpeicherPrefs
move.l FileSpeicher(a5),a1
move.l Filegroesse(a5),d0
move.l 4.w,a6
jsr _LVOFreeMem(a6)
rts
;;
** Lade Einstellungen
LadePrefs
lea PrefsFile1(pc),a3
move.l a3,d1
move.l #MODE_OLDFILE,d2
move.l DOSBase(a5),a6
jsr _LVOOpen(a6)
move.l d0,PrefsFileHandle(a5)
bne.s OpenPrefsFile
lea PrefsFileName(pc),a3
move.l a3,d1
move.l #MODE_OLDFILE,d2
jsr _LVOOpen(a6)
move.l d0,PrefsFileHandle(a5)
beq.s OpenFileError
OpenPrefsFile
move.l d0,d1
lea FIB(a5),a3
move.l a3,d2
jsr _LVOExamineFH(a6)
move.l fib_Size(a3),Filegroesse(a5)
move.l Filegroesse(a5),d0
cmp.l #1,d0
beq.s nixPrefs
tst.l d0
beq.s nixPrefs
move.l #MEMF_PUBLIC!MEMF_CLEAR,d1
move.l 4.w,a6
jsr _LVOAllocMem(a6)
move.l d0,FileSpeicher(a5)
beq.s ErrorFiSp
move.l PrefsFileHandle(a5),d1
move.l d0,d2
move.l Filegroesse(a5),d3
move.l DOSBase(a5),a6
jsr _LVORead(a6)
SchliesseFile
move.l PrefsFileHandle(a5),d1
jsr _LVOClose(a6)
rts
ErrorFiSp
moveq #28,d7 ;28 = kein Speicher für Prefs
bra.s SchliesseFile
OpenFileError
moveq #24,d7 ;24 = konnte File BangerMenu.prefs nicht öffnen
rts
nixPrefs
moveq #27,d7 ;27 = Prefs vorhanden aber leer
bra.s SchliesseFile
;;
** Library Öffnen + Schliessen
LibOeffne
move.l a5,a4
lea intname(pc),a1
bsr.s OeffneLib
lea dosname(pc),a1
bsr.s OeffneLib
lea gadname(pc),a1
bsr.s OeffneLib
rts
OeffneLib
moveq #37,d0
jsr _LVOOpenLibrary(a6)
move.l d0,(a4)+
beq.s LibError
rts
LibError
moveq #22,d7 ;22 = konnte Library nicht öffnen
rts
LibSchliesse
move.l 4.w,a6
moveq #3-1,d2
lea WindowHandle(a5),a4
SchliesseLib
move.l -(a4),a1
cmp.l #0,a1
beq.s notOpened
jsr _LVOCloseLibrary(a6)
notOpened
dbra d2,SchliesseLib
rts
;;
** PubScreenOeffne
PubScreenOeffne
move.l INTUIBase(a5),a6
suba.l a0,a0
jsr _LVOLockPubScreen(a6)
move.l d0,ScreenHandle(a5)
move.l d0,a0
suba.l a1,a1
move.l GADBase(a5),a6
jsr _LVOGetVisualInfoA(a6)
move.l d0,VisualInfo(a5)
beq.s VisualError
rts
VisualError
moveq #23,d7 ;23 = GetVisualInfo Fehler
bra.s ScrSchliesse
ScreenSchliesse
move.l GADBase(a5),a6
move.l VisualInfo(a5),a0
jsr _LVOFreeVisualInfo(a6)
ScrSchliesse
move.l INTUIBase(a5),a6
suba.l a0,a0
move.l ScreenHandle(a5),a1
jsr _LVOUnlockPubScreen(a6)
rts
;;
** LONG Daten
Fenster_Tags dc.l WA_Title,0
dc.l WA_Gadgets,0
dc.l WA_ScreenTitle,0
dc.l WA_Width,0
dc.l WA_Height,0
dc.l WA_Top,11
dc.l WA_Left,0
dc.l WA_IDCMP,IDCMP1!IDCMP2
dc.l WA_Flags,W_Flags1!W_Flags2
dc.l WA_NewLookMenus,-1
dc.l WA_AutoAdjust,-1
dc.l TAG_DONE
W_Flags1 equ WFLG_ACTIVATE!WFLG_SMART_REFRESH
W_Flags2 equ WFLG_DRAGBAR!WFLG_DEPTHGADGET!WFLG_CLOSEGADGET
IDCMP1 equ BUTTONIDCMP!RAWKEY
IDCMP2 equ IDCMP_CLOSEWINDOW!IDCMP_VANILLAKEY!IDCMP_REFRESHWINDOW
UniGad
dc.w 20,0,0,10
dc.l 0,0
dc.w 0
dc.l PLACETEXT_IN,0,0
topaz8:
dc.l 0
dc.w 8
dc.b 0,1
;;
** BYTE Daten
ParaTemplate dc.b 'NOKEY/S',0
intname INTNAME
dosname DOSNAME
gadname GADTOOLSNAME
inputname dc.b 'input.device',0
PrefsFileName dc.b 'S:'
PrefsFile1 dc.b 'BangerMenuDisk.prefs',0
topazFName8 dc.b 'topaz.font',0
WindowTitle dc.b 'BangerMenuDisk',0
dc.b '$VER: '
ScreenTitle dc.b 'BangerMenuDisk 1.4 (13-Feb-1996) © by Andre´ Trettin',0
;;